#ifndef __TEMPLATE_H__
#define __TEMPLATE_H__

#include <iostream>
#include <string>
#include <AutoFree.h>

namespace std
{
    template <typename... Args>
    std::string format(const std::string &format, Args... args)
    {
        size_t size = snprintf(nullptr, 0, format.c_str(), args...) + 1;

#ifdef USE_AUTO_FREE
        AutoFree buf(size);
        snprintf(buf(), size, format.c_str(), args...);
        return std::string(buf, size);
#else
        std::string _Str(size, '\0');
        _Str.resize(snprintf(&_Str[0], size, format.c_str(), args...));

        return _Str;
#endif // USE_AUTO_FREE
    }
}
#endif // !__TEMPLATE_H__
